//
// Created by daiyizheng on 2022/4/12.
//
#include <vector>

using namespace std;
class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        vector<vector<int>> dp(m, vector<int>(n, 0));

        //第一个
        if(obstacleGrid[0][0]==0){
            dp[0][0]=1;
        }
        //第一列
        for (int i = 1; i < m; ++i) {
            if(obstacleGrid[i][0]==0 && dp[i-1][0]==1){
                dp[i][0]=1;
            }
        }
        //第一行
        for (int i = 1; i <n ; ++i) {
            if(obstacleGrid[0][i]==0 && dp[0][i-1]==1){
                dp[0][i]=1;
            }
        }

        //状态转移
        for (int i = 1; i <m; ++i) {
            for (int j = 1; j <n ; ++j) {
                if (obstacleGrid[i][j]==1){
                    dp[i][j]=0;
                    continue;
                }
                dp[i][j] = dp[i][j-1] + dp[i-1][j];
            }
        }
        return dp[m-1][n-1];
    }
};